﻿using System;
using System.Collections.Generic;
using System.Linq;
using System.Web;
using System.Web.Mvc;
using System.Web.Routing;
using System.Web.Security;
using IndignadoFramework.BackBone.InternalServices;
using IndignadoFramework.BackBone.InternalServices.Implementacion;
using IndignadoFramework.FrontOffice.Models;
using IndignadoFramework.BackBone.Model;

namespace IndignadoFramework.FrontOffice.Controllers
{
    public class AccountController : SiteController
    {
        private UsuarioServices _usuarioI;
        private CategoriaTematicaServices _categorias;

        public AccountController()
            : this(new UsuarioServicesImpl())
        {
            _categorias = new CategoriaTematicaServicesImpl();
        }

        public AccountController(UsuarioServices user)
        {
            _usuarioI = user;
        }

        //
        // GET: /Account/LogOn
        public ActionResult LogOn()
        {
            if (Request.IsAuthenticated)
            {
                ViewBag.UsuarioNombre = _usuarioI.getNombreUsuario(Int32.Parse(User.Identity.Name), Site.Id);
            }
            return PartialView();
        }

        //
        // POST: /Account/LogOn

        [HttpPost]
        public ActionResult LogOn(LogOnModel model)
        {
            if (ModelState.IsValid)
            {
                // Cargo el LogOnModel en un UsuarioModel
                UsuarioModel u = new UsuarioModel();
                u.MovimientoId = Site.Id;
                if (model.RedSocial.Equals("F"))
                {
                    u.UsuarioFacebook = model.Id;
                }
                else
                {
                    u.UsuarioTwitter = model.Id;
                }
                u.UsuarioRedSocial = model.RedSocial;

                // Verifico si existe el usuario que intenta loguearse
                int usuarioId = _usuarioI.existUsuario(u);

                if (usuarioId != -1)
                {
                    if (usuarioId != -2)
                    {
                        // Autentico al usuario en el sitio
                        FormsAuthentication.SetAuthCookie(usuarioId.ToString(), false /* not persistent cookie */);
                        return RedirectToAction("Index", "Home");
                    }
                }
                else
                {
                    // Si no existe el usuario, lo redirijo al Registro
                    return RedirectToAction("Register", "Account");
                }
            }

            // If we got this far, something failed, redisplay form
            return PartialView(model);
        }

        //
        // GET: /Account/LogOff
        [Authorize]
        public ActionResult LogOff()
        {
            // Borro la cookie
            FormsAuthentication.SignOut();
            return RedirectToAction("Index", "Home");
        }

        //
        // GET: /Account/Register

        public ActionResult Register()
        {
            if (Request.IsAuthenticated)
            {
                return RedirectToAction("Index", "Home");
            }
            RegisterModel model = new RegisterModel();
            model.CategoriasTematicas = _categorias.getCategoriasTematicas(Site.Id);
            return PartialView(model);
        }

        //
        // POST: /Account/Register

        [HttpPost]
        public ActionResult Register(RegisterModel model)
        {
            if (ModelState.IsValid)
            {
                // Creo el Usuario a partir del modelo
                UsuarioModel u = new UsuarioModel();
                u.UsuarioNombre = model.Nombre;
                u.UsuarioMail = model.Mail;
                u.UsuarioFechaRegistro = DateTime.Now;
                u.UsuarioDadoBaja = false;
                u.UsuarioRedSocial = model.RedSocial;
                if (model.RedSocial.Equals("F"))
                    u.UsuarioFacebook = model.SocialId;
                else
                    u.UsuarioTwitter = model.SocialId;
                u.UsuarioUbicacionX = model.UbicacionX;
                u.UsuarioUbicacionY = model.UbicacionY;
                u.MovimientoId = Site.Id;
                u.CategoriasTematicas = model.CategoriasTematicas;

                // Agrego el usuario y obtengo su Id para autenticarlo en el sitio
                int userId = _usuarioI.addUsuario(u);

                if (userId > 0)
                {
                    // Autentico al usuario en el sitio
                    FormsAuthentication.SetAuthCookie(userId.ToString(), false /* not persistent cookie */);
                    return RedirectToAction("Index", "Home");
                }
            }

            // Si algo no funciona, vuelvo a desplegar el form
            model.CategoriasTematicas = _categorias.getCategoriasTematicas(Site.Id);
            return PartialView(model);
        }

    }
}
